﻿#ifndef CDBBASEOPER_H
#define CDBBASEOPER_H

#include <QStringList>
#include <QSqlDatabase>
#include <QSqlQuery>
#include "dbstruct.h"
#include "publiclog.h"

class QMutex;
class CLogBase;
class CDbTableDataInfo;
class CDbTableInfoMgr;

class CSqlAnalysisIndex
{
public:
    int     nWhere;         //SQL中Where字符串的索引
    int     nOrderBy;       //SQL中Order By字符串的索引
    int     nLimit;         //SQL中Limit字符串的索引
    QStringList listSrc;    //源字段
    QStringList listDest;   //目标字段

    CSqlAnalysisIndex()
    {
        nWhere = -1;
        nOrderBy = -1;
        nLimit = -1;
        listSrc.clear();
        listDest.clear();
    }
};

/***********************************************
* [className]   CDbBaseOper
* [func]        数据库操作基类
* [author]      jhb
* [date]        2023-12-18 17:01:31
* [Modification Log]
* Version               By              Notes
* v0.0.1                jhb             初次建立
************************************************/
class CDbBaseOper
{
public:
    CDbBaseOper(const QString &sConnectInfo);
    CDbBaseOper(const CDataBaseConfig &cDbCfg);
    virtual ~CDbBaseOper();

    //创建数据库操作实例
    static CDbBaseOper *createCDbSqlOper(const int &nDbType, const QString &sConnectInfo, const QString &sConnectName);
    static CDbBaseOper *createCDbSqlOper(const CDataBaseConfig &cDbCfg);
    //连接数据库
    virtual bool open();
    //判断数据库是否连接
    virtual bool isOpen();
    //断开数据库
    virtual void close();
    //初始化数据库表信息
    virtual void initTableInfo(CDbTableInfoMgr *pMgr);
    //执行SQL
    void handleSql(CDbTableDataInfo *pInfo);
    //尝试锁定
    bool tryLock(int nTime = 0);
    //解锁
    void unlock();
    //设置日志指针
    void setLogPtr(CLogBase *pLog) { m_pLog = pLog; }

protected:
    //判断数据库表是否存在
    virtual bool isTableExist(CDbTableInfoMgr *pMgr);
    //获取库表名
    virtual QString getTableName(CDbTableInfoMgr *pMgr);
    //获取字段名
    virtual QString getFieldName(const QString &sSrc);
    virtual QString getFieldName(const QString &sSrc, CDbTableInfoMgr *pMgr);
    //解析追加字段名
    virtual QString analysisAppendSql(CDbTableInfoMgr *pMgr);
    //执行创建语句
    virtual void handleCreateSql(CDbTableInfoMgr *pMgr);
    //执行插入语句
    virtual void handleInsertSql(CDbTableInfoMgr *pMgr);
    //执行删除语句
    virtual void handleDeleteSql(CDbTableInfoMgr *pMgr);
    //执行更新语句
    virtual void handleUpdateSql(CDbTableInfoMgr *pMgr);
    //执行查询语句
    virtual void handleSelectSql(CDbTableInfoMgr *pMgr);
    //执行批量插入语句
    virtual void handleInsertBatchSql(CDbTableInfoMgr *pMgr);
    //执行自定义语句
    virtual void handleCustomSql(CDbTableInfoMgr *pMgr);
    //直接执行语句
    virtual void handleExecuteSql(CDbTableInfoMgr *pMgr);
    //执行绑定语句
    virtual void handleBindValueSql(CDbTableInfoMgr *pMgr);

protected:
    //类型转换
    void typeChange(QVariant src, QVariant &dest);
    //解析字段名
    QString analysisFieldName(const QString &sSrc);
    //解析自定义语句SQL类型
    void analysisCustomSqlType(CDbTableInfoMgr *pMgr);
    //写日志
    void writeLog(const QString &sLogText, int nType = CLogBase::enLevelRun);

public:
    //QString             m_sSqlInfo;     //连接信息（字符串结构: "数据库名;端口;IP;用户名;密码;"）
    CDataBaseConfig     m_dbCfg;        //连接信息 (新增结构化连接信息)
    QSqlDatabase        m_db;           //数据库连接
    CLogBase            *m_pLog;        //日志组件指针
    QMutex              *m_pMutex;      //资源锁
};

#endif // CDBBASEOPER_H
